const fs = require("fs");
const path = require("path");

// 1.异步串行
// function rmdir(filepath, cb) {
//   // stat 方法可以判断文件存在性， 可以判断文件类型， 文件信息
//   fs.stat(filepath, function (err, statObj) {
//     if (err) return cb(errr);
//     if (statObj.isDirectory()) {
//       // 读取目录
//       // 拿到子节点递归删除
//       fs.readdir(filepath, function (err, dirs) {
//         if (err) return cb(err);
//         dirs = dirs.map((dir) => path.join(filepath, dir)); // dirs.length == 3
//         // 等待这个dirs 的儿子都删除后，在删除自己
//         let times = 0;
//         function next() {
//           // 串行， 其实 子节点可以并发删除
//           if (times === dirs.length) {
//             // 所有的儿子已经删除完毕了
//             return fs.rmdir(filepath, cb); // 最终删除父目录
//           }
//           let dir = dirs[times++]; // 拿出第一个来删除
//           rmdir(dir, next); // 递归删除
//         }
//         next();
//       });
//     } else {
//       fs.unlink(filepath, cb);
//     }
//   });
// }
// 2.并发删除，性能更好
// function rmdir(filepath, cb) {
//   // stat 方法可以判断文件存在性， 可以判断文件类型， 文件信息
//   fs.stat(filepath, function (err, statObj) {
//     if (err) return cb(errr);
//     if (statObj.isDirectory()) {
//       fs.readdir(filepath, function (err, dirs) {
//         if (err) return cb(err);
//         dirs = dirs.map((dir) => path.join(filepath, dir)); // dirs.length == 3
//         // ----Promise.all-----
//         if (dirs.length === 0) {
//           // 没有子节点
//           return fs.rmdir(filepath, cb);
//         }
//         let times = 0; // 计数器
//         function rmDone() {
//           if (++times === dirs.length) {
//             // 子节点都删除完毕，可以直接删除自己
//             return fs.rmdir(filepath, cb);
//           }
//         }
//         dirs.forEach((dir) => rmdir(dir, rmDone)); // 并发删除
//         /// ------------------
//       });
//     } else {
//       fs.unlink(filepath, cb);
//     }
//   });
// }
// 3.优化成promise
// function rmdir(filepath) {
//   return new Promise((resolve, reject) => {
//     fs.stat(filepath, function (err, statObj) {
//       if (err) return reject(errr);
//       if (statObj.isDirectory()) {
//         fs.readdir(filepath, function (err, dirs) {
//           if (err) return reject(err);
//           dirs = dirs.map((dir) => rmdir(path.join(filepath, dir)));
//           Promise.all(dirs).then(() => {
//             // 等待子节点删除完毕后，自己也删除
//             fs.rmdir(filepath, resolve);
//           });
//         });
//       } else {
//         fs.unlink(filepath, resolve);
//       }
//     });
//   });
// }
// asyc + awiat 来解决文件删除问题， 后续我们在写代码，基本上都是用async + await + promise 来处理异步问题
const fsPromise = require("fs/promises");
async function rmdir(filepath) {
  let statObj = await fsPromise.stat(filepath);
  if (statObj.isDirectory()) {
    let dirs = await fsPromise.readdir(filepath);
    dirs = dirs.map((dir) => rmdir(path.join(filepath, dir)));
    await Promise.all(dirs);
    // 等待子节点删除完毕后，自己也删除
    return fsPromise.rmdir(filepath);
  } else {
    return fsPromise.unlink(filepath);
  }
}
rmdir("a").then(() => {
  console.log("删除成功");
});
// 我们正常去写代码的时候 如果是复杂的目录 ， 我们会采用启动子进程来作删除

// 1.掌握文件操作api ， 可以掌握异步操作的方式（串行和并发），代码风格（promise更方便）
